package cn.tqfeiyang.smartadmin.office.service;

import cn.tqfeiyang.smartadmin.commons.mybatis.MPBaseService;
import cn.tqfeiyang.smartadmin.commons.toolbox.StringUtils;
import cn.tqfeiyang.smartadmin.office.entity.NoticeCategoryEntity;
import cn.tqfeiyang.smartadmin.office.entity.NoticeEntity;
import cn.tqfeiyang.smartadmin.office.mapper.NoticeMapper;
import cn.tqfeiyang.smartadmin.office.request.NoticeCreateDTO;
import cn.tqfeiyang.smartadmin.office.request.NoticeUpdateDTO;
import cn.tqfeiyang.smartadmin.office.request.NoticeQueryDTO;
import cn.tqfeiyang.smartadmin.office.response.NoticeQueryVO;
import cn.tqfeiyang.smartadmin.office.response.NoticeDetailVO;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageHelper;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import cn.tqfeiyang.smartadmin.commons.exception.BusinessException;
import cn.tqfeiyang.smartadmin.commons.pagination.PageData;
import cn.tqfeiyang.smartadmin.commons.toolbox.BeanUtils;
import cn.tqfeiyang.smartadmin.commons.toolbox.ValidationUtils;
import org.springframework.util.ReflectionUtils;

import java.util.*;

/**
 * 通知服务
 *
 * @author tqfeiyang
 * @since 2024-09-12
 */
@Service
public class NoticeService extends MPBaseService<NoticeMapper, NoticeEntity> {

    /**
     * 通知映射接口
     */
    @Resource
    private NoticeMapper noticeMapper;

    /**
     * 分页查询通知
     *
     * @param dto 请求数据
     * @return 通知分页
     */
    public PageData<NoticeQueryVO> getNoticePage(NoticeQueryDTO dto) {
        ValidationUtils.validateProperties(dto);
        PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
        return PageData.create(noticeMapper.getNoticeList(dto.getWrapper()));
    }

    /**
     * 获取全部通知
     *
     * @return 通知列表
     */
    public List<NoticeQueryVO> getAllNoticeList() {
        return noticeMapper.getNoticeList(Wrappers.emptyWrapper());
    }

    /**
     * 获取通知详情
     *
     * @param noticeId 通知id
     * @return 通知详情
     */
    public NoticeDetailVO getNoticeInfo(Long noticeId) {
        //

        NoticeEntity entity = noticeMapper.selectByIdDeep(noticeId);


        NoticeEntity noticeEntity = checkNoticeExists(noticeId);
        return BeanUtils.map(noticeEntity, NoticeDetailVO.class);
    }

    /**
     * 添加通知
     *
     * @param dto 请求数据
     * @return 通知id
     */
    @Transactional(rollbackFor = Exception.class)
    public Long createNotice(NoticeCreateDTO dto) {
        ValidationUtils.validateProperties(dto);
        NoticeEntity noticeEntity = BeanUtils.map(dto, NoticeEntity.class);
        saveOrUpdate(noticeEntity);
        return noticeEntity.getNoticeId();
    }

    /**
     * 修改通知
     *
     * @param noticeId 通知id
     * @param dto 请求数据
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateNotice(Long noticeId, NoticeUpdateDTO dto) {
        checkNoticeExists(noticeId);
        ValidationUtils.validateProperties(dto);
        NoticeEntity noticeEntity = BeanUtils.copy(dto, NoticeEntity.class);
        noticeEntity.setNoticeId(noticeId);
        noticeMapper.updateById(noticeEntity);
    }

    /**
     * 删除通知
     *
     * @param noticeId 通知id
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteNotice(Long noticeId) {
        checkNoticeExists(noticeId);
        removeById(noticeId);
    }

    /**
     * 检查通知实体是否存在
     *
     * @param noticeId 通知id
     * @return 通知实体
     */
    protected NoticeEntity checkNoticeExists(Long noticeId) {
        Assert.notNull(noticeId, "通知id不能为空");
        NoticeEntity noticeEntity = noticeMapper.selectById(noticeId);
        if (ObjectUtils.isEmpty(noticeEntity)) {
            throw new BusinessException("通知不存在");
        }
        return noticeEntity;
    }

    /**
     * 批量删除通知
     *
     * @param noticeIds 通知id集合
     */
    @Transactional(rollbackFor = Exception.class)
    public void batchDeleteNotices(Set<Long> noticeIds) {
        Assert.notNull(noticeIds, "通知id集合不能为空");
        noticeIds.forEach(noticeId -> {
            checkNoticeExists(noticeId);
            noticeMapper.deleteById(noticeId);
        });
    }

    /**
     * 导出通知Excel
     *
     * @param response
     */
    public void exportNoticeExcel(HttpServletResponse response) {
        List<NoticeQueryVO> list = getAllNoticeList();
        //ExcelUtils.exportExcel(response, list, NoticeQueryVO.class, "通知");
    }

    /**
     * 修改排序
     *
     * @param noticeId 通知id
     * @param sort 排序
     */
    public void updateSortField(Long noticeId, Integer sort) {
        checkNoticeExists(noticeId);
        Assert.notNull(sort, "sort不能为空");
        NoticeEntity noticeEntity = new NoticeEntity();
        noticeEntity.setNoticeId(noticeId);
        noticeEntity.setSort(sort);
        noticeMapper.updateById(noticeEntity);
    }
}
